package com.sqstudio.util
{
	import flash.text.StaticText;

	// ii milliseconds
	
	// ss seconds
	// mm minutes
	// hh hours
	
	// dd days
	// MM months
	// yy years
	/**
	 * 时间格式类
	 * @author Nestor
	 * 
	 */	
	public class TimeFormat
	{
		/**标准时间格式*/
		public static const STANDARDFORMAT:String = "h:mm:ss";
		/**常规时间格式*/
		public static const DEFAULTFORMAT:String = "h时m分ss秒";
		
		/**毫秒*/
		public static const TIME_MILLISECONDS:String = "ms";
		/**秒*/
		public static const TIME_SECONDS:String = "ss";
		
		/**标准日期格式    eg:YYYY-MM-DD hh:mm:ss */
		public static const STANDARD_DATE:String = "YYYY-MM-DD hh:mm:ss";
		/**常规日期格式 eg:YYYY年M月D日 hh:mm:ss */
		public static const DEFAULT_DATE:String = "YYYY年MM月DD日 hh:mm:ss";
		
		
		
		/**
		 *将秒数转换为时分秒格式 
		 * @param seconds 秒数
		 * @param formatStr 时间格式 ：1. TimeFormat.STANDARDFORMAT - "h:mm:ss"     标准时间格式<br>
		 *                            2. TimeFormat.DEFAULTFORMAT  - "h时m分ss秒"; 常规时间格式
		 * @return 转换后的格式
		 * 
		 */		
		public static function format(seconds:int,formatStr:String=TimeFormat.STANDARDFORMAT):String{
			if(formatStr == null) return "";
			var output:String = "";
			var hour:int = (seconds/3600);
			seconds %= 3600; 
			var minute:int = seconds/60;
			seconds %= 60;
			var second:int = seconds;
			var args:Array = new Array();
			for(var i:int = 0;i<formatStr.length;){
				var char:String = formatStr.charAt(i);
				var len:int = 0;
				var typeChar:String = null;
				switch(char){
					case "h":
						typeChar = char;
						args.push(hour);
						break;
					case "m":
						typeChar = char;
						args.push(minute);
						break;
					case "s":
						typeChar = char;
						args.push(second);
						break;
					default:
						typeChar = null;
						output+=char;
				}
				if(char==typeChar){
					while(char==typeChar){
						len++;
						i++;
						char = formatStr.charAt(i);
					}
					output += convert(len,int(args.pop()));
				}else{
					i++;
				}
			}
			
			return output;//output;
		}
		/**
		 *计算 所给时间 加上 所给秒数的新时间 
		 * @param aTime 所给时间
		 * @param addSeconds 所给秒数
		 * @return 新时间
		 * 
		 */		
		public static function timeAddSeconds(aTime: Date, addSeconds: Number): Date
		{
			var resultTime: Date = new Date();
			resultTime.setTime(aTime.getTime() + addSeconds * 1000);
			return resultTime;    		
		}
		
		/**
		 *计算起始时间到结束时间的间隔 
		 * @param type ：1. TimeFormat.TIME_MILLISECONDS-"ms"-返回毫秒数<br>
		 * 	             2. TimeFormat.TIME_SECONDS-"ss" 返回秒数 
		 * @param aTime 起始时间
		 * @param bTime 结束时间
		 * @return 返回秒数或毫秒数
		 * 
		 */		
		public static function datediff(aTime: Date, bTime: Date,type: String = TimeFormat.TIME_SECONDS ): int
		{
			var result: int;
			switch (type)
			{
				case "ms":
					result = bTime.getTime() - aTime.getTime();
					break;
				default :
					result = Math.ceil((bTime.getTime() - aTime.getTime()) / 1000.00);
					break;
			}
			return result;     		
		}
		/**
		 *转换世界标准时间 
		 * @param date 传入日期
		 * @return 返回世界标准时间
		 * 
		 */		
		public static function toUTC(date: Date): Date
		{
			return TimeFormat.timeAddSeconds(date, -28800);
		}
		/**
		 *将date转换为常用的日期时间格式 
		 * @param date 所给的date
		 * @param formatStr  ： 1.TimeFormat.DEFAULT_DATE    将返回 "YYYY年MM月DD日 hh:mm:ss";
		 * 					   <br>2.TimeFormat.STANDARD_DATE	将返回 "YYYY-MM-DD hh:mm:ss";
		 * 
		 * @return 返回常用日期时间格式
		 * 
		 */		
		public static function dateFormat(date:Date, formatStr:String = TimeFormat.STANDARD_DATE):String {
			/* DateUtil.format(new Date(), "YYYY-MM-DD hh:mm:ss") ;      会返回"2008-07-15 14:03:26" 
			DateUtil.format(new Date(), "YY年M月D日 hh:mm:ss") ;        会返回"08年7月15日 14:03:26" 			 */
			var str:String;
			str = formatStr.replace(/([YMDhms])\1*/g, function():String {
				var matchStr:String = arguments[0] as String;
				var replaceStr:String;
				switch(matchStr.charAt()) {
					case 'Y':
						replaceStr = getIntStrAtLength(date.getFullYear(), matchStr.length);
						break;
					case 'M':
						replaceStr = getIntStrAtLength(date.getMonth() + 1, matchStr.length);
						break;
					case 'D':
						replaceStr = getIntStrAtLength(date.getDate(), matchStr.length);
						break;
					case 'h':
						replaceStr = getIntStrAtLength(date.getHours(), matchStr.length);
						break;
					case 'm':
						replaceStr = getIntStrAtLength(date.getMinutes(), matchStr.length);
						break;
					case 's':
						replaceStr = getIntStrAtLength(date.getSeconds(), matchStr.length);
						break;
				}
				return replaceStr;
			});
			return str;
		}
		
		private static function getIntStrAtLength(value:uint, length:uint):String {
			var str:String = value.toString();
			if (length > 1) {
				if (str.length > length) {
					str = str.substr( -length);
				}else {
					while (str.length < length) {
						str = "0" + str;
					}
				}
			}
			return str;
		}
		
		
		private static function convert(bit:uint,val:int):String{
			var s:String = "";
			var valS:String = val.toString();
			if(bit <= valS.length) return valS;
			//if(bit < valS.length) return valS.slice(-bit);
			if(bit > valS.length){
				for(var i:int = 0;i<bit-valS.length;i++){
					s +="0";					
				}
				return s+valS;
				
			}
			return s;
		}
		
		
		/**
		 *字符串转日期 
		 * @param str  要转的日期字符串 如:2005:03:5 10.2.3.1
		 * @param format	传入的日期的格式如 y:m:d h:mi:s:ms   y:年m:月d日 h小时:mi分钟:s秒:ms毫秒
		 * @param splitStr 分割符 ": ."  第一个字符为用于年月日之间的分割 第二个为（年、月、日）与 （时、分、秒、毫秒）之间的分割
		 * @return 返回Date类型
		 * 
		 * <br><br>注：format 和splitStr的格式要匹配
		 * <pre> eg:
		 * var date:Date = DateFormat.stringToDate("2005:03:5 10.2.3.1", "y:m:d h.mi.s.ms", ": .");
		 * var date:Date = DateFormat.stringToDate("5:03:2005 10:2:3:1", "d:m:y h:mi:s:ms", ": :");
		 *	</pre>
		 * 
		 */		
		public static function stringToDate(str:String, format:String= "y:m:d h:mi:s:ms", splitStr:String=": :"):Date {
			if(splitStr.length != 3){
				throw new Error("传入分隔符格式错误！");
			}
			var a:String = splitStr.charAt(0)
			var b:String = splitStr.charAt(1)
			var c:String = splitStr.charAt(2)
			var y:int;
			var m:int;
			var d:int;
			var h:int;
			var mi:int;
			var s:int;
			var ms:int;
			var strArr:Array = str.split(b);
			var fArr:Array = format.split(b);
			var fArr1:Array = String(fArr[0]).split(a);
			var fArr2:Array;
			var strArr1:Array = String(strArr[0]).split(a);
			var strArr2:Array;
			var i:int = 0;
			var len:int = strArr1.length;
			//解析年月日
			for(i=0; i<len; i++) {
				switch(String(fArr1[i])) {
					case "y":
						y = strArr1[i];
						break;
					case "m":
						m = strArr1[i];
						break;
					case "d":
						d = strArr1[i];
						break;
				}
			}
			//解析时分秒
			if(strArr[1]) {
				strArr2 = String(strArr[1]).split(c);
				fArr2 = String(fArr[1]).split(c);
				len = strArr2.length;
				for(i=0; i<len; i++) {
					switch(String(fArr2[i])) {
						case "h":
							h = strArr2[i];
							break;
						case "mi":
							mi = strArr2[i];
							break;
						case "s":
							s = strArr2[i];
							break;
						case "ms":
							ms = strArr2[i];
							break;
					}
				}
			}else {
				h = mi = s = ms = 0;
			}
			var date:Date;
			date = new Date(y,m-1,d,h,mi,s,ms);
			return date;
		}
		
	}
}